// 导入登录接口
import { loginAPI,
  getUserProfileAPI,
  getUserInfoAPI } from '@/api/user'
import { resetRouter } from '@/router'
import { getToken, setToken, removeToken } from '@/utils/auth'
const state = () => {
  return {
    // 存储用户令牌
    // 刷新页面时从本地取token，借助逻辑或
    token: getToken() || '',
    // 存储用户信息
    userInfo: {}
  }
}

const mutations = {
  // 设置token
  setToken: (state, token) => {
    state.token = token
    // 本地再存一份token
    setToken(token)
  },
  // 设置用户信息
  setUserInfo: (state, userInfo) => {
    state.userInfo = userInfo
  },
  // 清空token
  removeToken: (state) => {
    state.token = ''
    // 同时也要清空本地的token
    removeToken()
  },
  // 清空用户信息
  removeUserInfo: (state) => {
    state.userInfo = {}
  }
}

const actions = {
  // 登录action
  loginAction: async(store, loginForm) => {
    // 调接口，发起登录请求
    const resp = await loginAPI(loginForm)
    // 提交mutation进行赋值
    store.commit('setToken', resp.data)
  },

  // 获取用户信息
  userInfoAction: async({ commit }) => {
    // 调接口，发请求
    const { data } = await getUserProfileAPI()
    // 基于此接口返回的用userId发起第二次请求，获取用户头像
    const resp = await getUserInfoAPI(data.userId)
    const userObj = { ...data, ...resp.data }
    // ...data, ...resp.data 说明两个对象合并之后作为参数传给 mutation 函数
    commit('setUserInfo', userObj)
    // 返回 userObj
    return userObj
  },

  // 退出登录
  logoutAction: ({ commit }) => {
    commit('removeToken')
    commit('removeUserInfo')
    // 重置路由实例(把路由实例的路由表中的所有信息删除)
    resetRouter()
    // 清空vuex中的路由信息
    commit('route/removeRoutes', null, {
      // 从全局模块下出发
      root: true
    })
    commit('settings/changeSetting', null, { root: true })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
